import os
from typing import Dict, Any
from src.config import SUBTITLE_DIR
from src.database.dao_factory import DAOFactory
from src.utils.logger import log_info, log_error, log_warning

class TextEditorController:
    """控制器类，处理文本编辑相关请求"""
    
    def __init__(self):
        """初始化文本编辑器控制器"""
        log_info("文本编辑器控制器初始化")
        self.dao_factory = DAOFactory.get_instance()

    def get_subtitle_content(self, file_id: str) -> Dict[str, Any]:
        """
        获取指定字幕文件的内容
        
        Args:
            file_name: 字幕文件名（相对于字幕目录）
            
        Returns:
            包含文件内容和状态的字典
        """
        file_path = self.dao_factory.get_uploaded_file_dao().get_by_id(file_id).file_path
        content = self._get_file_content(file_path)
        return {
            "content": content,
        }

    def save_subtitle_content(self, file_id: str, content: str) -> Dict[str, Any]:
        """
        保存字幕内容到指定文件
        
        Args:
            file_name: 字幕文件名（相对于字幕目录）
            content: 要保存的文本内容
            
        Returns:
            包含保存状态的字典
        """
        file_path = self.dao_factory.get_uploaded_file_dao().get_by_id(file_id).file_path
        return self._save_file_content(file_path, content)

    def _get_file_content(self, file_path: str) -> Dict[str, Any]:
        """
        获取指定文件的内容
        
        Args:
            file_path: 文件的绝对路径
            
        Returns:
            包含文件内容和状态的字典
        """
        try:
            # 检查路径是否有效
            if not file_path or not os.path.isfile(file_path):
                raise FileNotFoundError(f"文件不存在: {file_path}")
            
            # 读取文件内容
            with open(file_path, 'r', encoding='utf-8') as f:
                return f.read()
            
        except PermissionError:
            raise PermissionError(f"无权限访问文件: {file_path}")
        except UnicodeDecodeError:
            raise UnicodeDecodeError(f"文件编码错误: {file_path}")
        except Exception as e:
            raise Exception(f"读取文件失败: {str(e)}")

    def _save_file_content(self, file_path: str, content: str) -> Dict[str, Any]:
        """
        保存内容到指定文件
        
        Args:
            file_path: 文件的绝对路径
            content: 要保存的文本内容
            
        Returns:
            包含保存状态的字典
        """
        try:
            # 确保目录存在
            directory = os.path.dirname(file_path)
            if directory and not os.path.exists(directory):
                os.makedirs(directory, exist_ok=True)
                log_info(f"创建目录: {directory}")
            
            # 写入文件
            with open(file_path, 'w', encoding='utf-8') as f:
                return f.write(content)
            
        except PermissionError:
            raise PermissionError(f"无权限写入文件: {file_path}")
        except Exception as e:
            raise Exception(f"保存文件失败: {str(e)}")